#requires AutoHotkey v1.1
-; UltimateKEYS (for AutoHotkey v1.1).ahk - 2023-09-05
+; UltimateKEYS (for AutoHotkey v1.1).ahk - 2024-06-04
-; Website : www.ultimatekeys.info (pieter-degroote.github.io/UltimateKEYS/)
+; Website : https://pieter-degroote.github.io/UltimateKEYS/
-; License : GNU General Public License Version 3
+; GitHub : https://github.com/pieter-degroote/UltimateKEYS
-; GitHub : github.com/pieter-degroote/UltimateKEYS
+; License : GNU General Public License Version 3
-; Requirements :
+; Configuration :
; Keyboard layout (on Windows) : US QWERTY
-; AutoHotkey v1.1 (www.autohotkey.com)
-
#NoEnv ; avoids checking empty variables to see if they are environment variables
-ListLines Off ; omits recently executed lines from history (for privacy and security)
#KeyHistory 0 ; disables the key history (for privacy and security)
+ListLines Off ; omits recently executed lines from history (for privacy and security)
SendMode Input ; optimizes for faster and more reliable input
cmpQuad.item["3"] := "{u+2001}" ; em quad
-; Compose : Arrows and Pointers
+; Compose : Arrows and Pointing Triangles
cmpArrow := ComObjCreate("Scripting.Dictionary")
cmpArrow.item["w"] := "{u+25b2}" ; (▲) black up-pointing triangle
cmpSymbols.item["d"] := "{u+22c4}" ; (⋄) diamond operator
cmpSymbols.item["e"] := "{u+212e}" ; (℮) estimated symbol
cmpSymbols.item["f"] := "{u+2640}" ; (♀) female sign (Venus)
-cmpSymbols.item["h"] := "{u+2126}" ; (Ω) ohm sign (backwards compatibility)
+cmpSymbols.item["h"] := "{u+2302}" ; (⌂) house
+cmpSymbols.item["H"] := "{u+2126}" ; (Ω) ohm sign (backwards compatibility)
cmpSymbols.item["i"] := "{u+2300}" ; (⌀) diameter sign
cmpSymbols.item["l"] := "{u+2113}" ; (ℓ) script small l
cmpSymbols.item["L"] := "{u+2112}" ; (ℒ) Laplace transform
cmpSymbols.item["m"] := "{u+2642}" ; (♂) male sign (Mars)
cmpSymbols.item["M"] := "{u+2120}" ; (℠) service mark
-cmpSymbols.item["r"] := "{u+211e}" ; (℞) prescription take (Recipere)
-cmpSymbols.item["R"] := "{u+211e}" ; (℞) prescription take (Recipere)
+cmpSymbols.item["p"] := "{u+211e}" ; (℞) prescription take (Recipere)
+cmpSymbols.item["P"] := "{u+211e}" ; (℞) prescription take (Recipere)
+cmpSymbols.item["r"] := "{u+211f}" ; (℟) response (liturgy)
+cmpSymbols.item["R"] := "{u+211f}" ; (℟) response (liturgy)
+cmpSymbols.item["v"] := "{u+2123}" ; (℣) versicle (liturgy)
+cmpSymbols.item["V"] := "{u+2123}" ; (℣) versicle (liturgy)
cmpSymbols.item["x"] := "{u+203b}" ; (※) reference mark
cmpSymbols.item["2"] := "{u+266b}" ; (♫) beamed eighth notes
cmpSymbols.item["3"] := "{u+2042}" ; (⁂) asterism
cmpMathSymbols.item["6"] := "{u+2220}" ; (∠) angle symbol
cmpMathSymbols.item["9"] := "{u+221f}" ; (∟) right angle
cmpMathSymbols.item["0"] := "{u+2221}" ; (∡) measured angle
+cmpMathSymbols.item[","] := "{u+2219}" ; (∙) bullet operator
cmpMathSymbols.item["+"] := "{u+2295}" ; (⊕) circled plus
cmpMathSymbols.item["-"] := "{u+2296}" ; (⊖) circled minus
cmpMathSymbols.item["*"] := "{u+2297}" ; (⊗) circled times
cmpDigitEight := ComObjCreate("Scripting.Dictionary")
cmpCapitalP := ComObjCreate("Scripting.Dictionary")
-cmpSemicolon := ComObjCreate("Scripting.Dictionary")
+cmpVerticalLine := ComObjCreate("Scripting.Dictionary")
cmpAsterisk := ComObjCreate("Scripting.Dictionary")
cmpExclam := ComObjCreate("Scripting.Dictionary")
cmpQuestion := ComObjCreate("Scripting.Dictionary")
cmpSymbols.item["o"] := "{u+00a7}" ; (§) section sign
cmpCapitalS.item["o"] := "{u+00a7}" ; (§) section sign
cmpSmallT.item["m"] := "{u+2122}" ; (™) trademark symbol
-cmpSemicolon.item["b"] := "{u+2022}" ; (•) bullet
-cmpSemicolon.item[";"] := "{u+2022}" ; (•) bullet
-cmpSemicolon.item["t"] := "{u+2023}" ; (‣) triangular bullet
-cmpSemicolon.item[">"] := "{u+2023}" ; (‣) triangular bullet
-cmpSemicolon.item["h"] := "{u+2043}" ; (⁃) hyphen bullet
-cmpSemicolon.item["-"] := "{u+2043}" ; (⁃) hyphen bullet
-cmpSemicolon.item["w"] := "{u+25e6}" ; (◦) white bullet
-cmpSemicolon.item["o"] := "{u+25e6}" ; (◦) white bullet
+cmpVerticalLine.item["|"] := "{u+2016}" ; (‖) double vertical line
cmpAcuteAccent.item["1"] := "{u+2032}" ; (′) prime
cmpAcuteAccent.item["2"] := "{u+2033}" ; (″) double prime
cmpAcuteAccent.item["3"] := "{u+2034}" ; (‴) triple prime
cmpStroke.item["/"] := "{u+00f7}" ; (÷) division sign
cmpAsterisk.item["o"] := "{u+00b0}" ; (°) degree sign
cmpRingAbove.item["*"] := "{u+00b0}" ; (°) degree sign
-cmpDotAbove.item["."] := "{u+00b7}" ; (·) middle dot
+cmpDotAbove.item["-"] := "{u+00b7}" ; (·) middle dot
cmpDotAbove.item["3"] := "{u+2026}" ; (…) horizontal ellipsis
+cmpDotAbove.item["."] := "{u+2026}" ; (…) horizontal ellipsis
cmpArrow.item["-"] := "{u+00aa}" ; (ª) feminine ordinal indicator (Spanish, Portuguese, Italian, Galician)
cmpRingAbove.item["-"] := "{u+00ba}" ; (º) masculine ordinal indicator (Spanish, Portuguese, Italian, Galician)
cmpExclam.item["!"] := "{u+00a1}" ; (¡) inverted exclamation mark
cmpTilde.item["~"] := "{u+2248}" ; (≈) almost equal to
+; Compose : Bullets and Small Geometric Shapes (;)
+
+cmpSemicolon := ComObjCreate("Scripting.Dictionary")
+cmpSemicolon.item["b"] := "{u+2022}" ; (•) bullet
+cmpSemicolon.item["o"] := "{u+25e6}" ; (◦) white bullet
+cmpSemicolon.item["h"] := "{u+2043}" ; (⁃) hyphen bullet
+cmpSemicolon.item["t"] := "{u+2023}" ; (‣) triangular bullet
+cmpSemicolon.item["q"] := "{u+25aa}" ; (▪) black small square
+cmpSemicolon.item["u"] := "{u+25ab}" ; (▫) white small square
+cmpSemicolon.item["w"] := "{u+25b4}" ; (▴) black up-pointing small triangle
+cmpSemicolon.item["a"] := "{u+25c2}" ; (◂) black left-pointing small triangle
+cmpSemicolon.item["s"] := "{u+25be}" ; (▾) black down-pointing small triangle
+cmpSemicolon.item["d"] := "{u+25b8}" ; (▸) black right-pointing small triangle
+cmpSemicolon.item["i"] := "{u+25b5}" ; (▵) white up-pointing small triangle
+cmpSemicolon.item["j"] := "{u+25c3}" ; (◃) white left-pointing small triangle
+cmpSemicolon.item["k"] := "{u+25bf}" ; (▿) white down-pointing small triangle
+cmpSemicolon.item["l"] := "{u+25b9}" ; (▹) white right-pointing small triangle
+cmpSemicolon.item["z"] := "{u+25a0}" ; (■) black square
+cmpSemicolon.item["x"] := "{u+25a1}" ; (□) white square
+cmpSemicolon.item["c"] := "{u+25c6}" ; (◆) black diamond
+cmpSemicolon.item["v"] := "{u+25c7}" ; (◇) white diamond
+cmpSemicolon.item[";"] := "{u+2022}" ; (•) bullet
+
+
; Compose : Vulgar Fractions
cmpDigitOne := ComObjCreate("Scripting.Dictionary")
cmpDiaeresis.item[","] := "{u+201e}" ; („) double low-9 quotation mark
cmpCedillaOgonek.item["'"] := "{u+201a}" ; (‚) single low-9 quotation mark
cmpAcuteAccent.item[","] := "{u+201a}" ; (‚) single low-9 quotation mark
+cmpCedillaOgonek.item[","] := "{u+201a}" ; (‚) single low-9 quotation mark
cmpDiaeresis.item["["] := "{u+201c}" ; (“) left double quotation mark
cmpBracketLeft.item[chr(34)] := "{u+201c}" ; (“) left double quotation mark
cmpDiaeresis.item["]"] := "{u+201d}" ; (”) right double quotation mark
cmpDigitTwo.item["t"] := "{u+26a0}" ; (⚠) warning sign
cmpDigitTwo.item["u"] := "{u+26a1}" ; (⚡) high voltage sign
cmpDigitTwo.item["v"] := "{u+26d4}" ; (⛔) no entry
+cmpDigitTwo.item["w"] := "{u+231a}" ; (⌚) watch
+cmpDigitTwo.item["x"] := "{u+231b}" ; (⌛) hourglass
cmpDigitThree.item["a"] := "{u+2701}" ; (✁) upper blade scissors
cmpDigitThree.item["b"] := "{u+2702}" ; (✂) black scissors
>!z::
if GetKeyState("CapsLock", "T")
- Send {u+00c0} ; (À) A with grave
+ Send {u+00c1} ; (Á) A with acute
else
- Send {u+00e0} ; (à) a with grave
+ Send {u+00e1} ; (á) a with acute
return
>!+z::
if GetKeyState("CapsLock", "T")
- Send {u+00e0} ; (à) a with grave
+ Send {u+00e1} ; (á) a with acute
else
- Send {u+00c0} ; (À) A with grave
+ Send {u+00c1} ; (Á) A with acute
return
>!x::
if GetKeyState("CapsLock", "T")
- Send {u+00c1} ; (Á) A with acute
+ Send {u+00c0} ; (À) A with grave
else
- Send {u+00e1} ; (á) a with acute
+ Send {u+00e0} ; (à) a with grave
return
>!+x::
if GetKeyState("CapsLock", "T")
- Send {u+00e1} ; (á) a with acute
+ Send {u+00e0} ; (à) a with grave
else
- Send {u+00c1} ; (Á) A with acute
+ Send {u+00c0} ; (À) A with grave
return
>!d::
>!f::
if GetKeyState("CapsLock", "T")
- Send {u+00c8} ; (È) E with grave
+ Send {u+00c9} ; (É) E with acute
else
- Send {u+00e8} ; (è) e with grave
+ Send {u+00e9} ; (é) e with acute
return
>!+f::
if GetKeyState("CapsLock", "T")
- Send {u+00e8} ; (è) e with grave
+ Send {u+00e9} ; (é) e with acute
else
- Send {u+00c8} ; (È) E with grave
+ Send {u+00c9} ; (É) E with acute
return
>!g::
if GetKeyState("CapsLock", "T")
- Send {u+00c9} ; (É) E with acute
+ Send {u+00c8} ; (È) E with grave
else
- Send {u+00e9} ; (é) e with acute
+ Send {u+00e8} ; (è) e with grave
return
>!+g::
if GetKeyState("CapsLock", "T")
- Send {u+00e9} ; (é) e with acute
+ Send {u+00e8} ; (è) e with grave
else
- Send {u+00c9} ; (É) E with acute
+ Send {u+00c8} ; (È) E with grave
return
>!r::
>!v::
if GetKeyState("CapsLock", "T")
- Send {u+00cc} ; (Ì) I with grave
+ Send {u+00cd} ; (Í) I with acute
else
- Send {u+00ec} ; (ì) i with grave
+ Send {u+00ed} ; (í) i with acute
return
>!+v::
if GetKeyState("CapsLock", "T")
- Send {u+00ec} ; (ì) i with grave
+ Send {u+00ed} ; (í) i with acute
else
- Send {u+00cc} ; (Ì) I with grave
+ Send {u+00cd} ; (Í) I with acute
return
>!b::
if GetKeyState("CapsLock", "T")
- Send {u+00cd} ; (Í) I with acute
+ Send {u+00cc} ; (Ì) I with grave
else
- Send {u+00ed} ; (í) i with acute
+ Send {u+00ec} ; (ì) i with grave
return
>!+b::
if GetKeyState("CapsLock", "T")
- Send {u+00ed} ; (í) i with acute
+ Send {u+00ec} ; (ì) i with grave
else
- Send {u+00cd} ; (Í) I with acute
+ Send {u+00cc} ; (Ì) I with grave
return
>!t::
>!,::
if GetKeyState("CapsLock", "T")
- Send {u+00d2} ; (Ò) O with grave
+ Send {u+00d3} ; (Ó) O with acute
else
- Send {u+00f2} ; (ò) o with grave
+ Send {u+00f3} ; (ó) o with acute
return
>!<::
if GetKeyState("CapsLock", "T")
- Send {u+00f2} ; (ò) o with grave
+ Send {u+00f3} ; (ó) o with acute
else
- Send {u+00d2} ; (Ò) O with grave
+ Send {u+00d3} ; (Ó) O with acute
return
>!.::
if GetKeyState("CapsLock", "T")
- Send {u+00d3} ; (Ó) O with acute
+ Send {u+00d2} ; (Ò) O with grave
else
- Send {u+00f3} ; (ó) o with acute
+ Send {u+00f2} ; (ò) o with grave
return
>!>::
if GetKeyState("CapsLock", "T")
- Send {u+00f3} ; (ó) o with acute
+ Send {u+00f2} ; (ò) o with grave
else
- Send {u+00d3} ; (Ó) O with acute
+ Send {u+00d2} ; (Ò) O with grave
return
>!p::
>!h::
if GetKeyState("CapsLock", "T")
- Send {u+00d9} ; (Ù) U with grave
+ Send {u+00da} ; (Ú) U with acute
else
- Send {u+00f9} ; (ù) u with grave
+ Send {u+00fa} ; (ú) u with acute
return
>!+h::
if GetKeyState("CapsLock", "T")
- Send {u+00f9} ; (ù) u with grave
+ Send {u+00fa} ; (ú) u with acute
else
- Send {u+00d9} ; (Ù) U with grave
+ Send {u+00da} ; (Ú) U with acute
return
>!j::
if GetKeyState("CapsLock", "T")
- Send {u+00da} ; (Ú) U with acute
+ Send {u+00d9} ; (Ù) U with grave
else
- Send {u+00fa} ; (ú) u with acute
+ Send {u+00f9} ; (ù) u with grave
return
>!+j::
if GetKeyState("CapsLock", "T")
- Send {u+00fa} ; (ú) u with acute
+ Send {u+00f9} ; (ù) u with grave
else
- Send {u+00da} ; (Ú) U with acute
+ Send {u+00d9} ; (Ù) U with grave
return
>!y::
>!_::Send {u+2014} ; (—) em dash
>!=::Send {u+00d7} ; (×) multiplication sign
->!+=::Send {u+00f7} ; (÷) division sign
+>!+::Send {u+00f7} ; (÷) division sign
>![::Send {u+00ab} ; («) left-pointing double angle quotation mark
>!{::Send {u+2039} ; (‹) left-pointing single angle quotation mark
>!;::Send {u+00b0} ; (°) degree sign
>!+;::Send {u+00b7} ; (·) middle dot
->!'::Send {u+2020} ; (†) dagger
->!"::Send {u+2021} ; (‡) double dagger
+>!'::Send {u+266a} ; (♪) eighth note
+>!"::Send {u+266b} ; (♫) beamed eighth notes
>!\::Send {u+2002} ; en space
>!|::Send {u+2003} ; em space
>!/::Send {u+00bf} ; (¿) inverted question mark
->!?::Send {u+2026} ; (…) horizontal ellipsis
+>!?::Send {u+2022} ; (•) bullet
>!space::Send {u+00a0} ; non-breaking space (NBSP)
>!+space::Send {u+00a0} ; non-breaking space (NBSP)
; Configuration : Compose Key Selector
>!`::
+>!~::
>!sc056::
+>!+sc056::
Input, keyA, L1, {bs}{del}{esc}{home}{end}
Input, keyB, L1, {bs}{del}{esc}{home}{end}
Send % cmpCapitalT.item[keyB]
else if (keyA == "P")
Send % cmpCapitalP.item[keyB]
- else if (keyA == ";")
- Send % cmpSemicolon.item[keyB]
+ else if (keyA == "|")
+ Send % cmpVerticalLine.item[keyB]
else if (keyA == "*")
Send % cmpAsterisk.item[keyB]
else if (keyA == "!")
Send % cmpLessThan.item[keyB]
else if (keyA == ">")
Send % cmpGreaterThan.item[keyB]
+ else if (keyA == ";")
+ Send % cmpSemicolon.item[keyB]
else if (keyA == "1")
Send % cmpDigitOne.item[keyB]
else if (keyA == "2")